package com.why.handler;


import com.why.message.RpcResponse;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
import io.netty.util.AttributeKey;
import io.netty.util.ReferenceCountUtil;
import lombok.extern.slf4j.Slf4j;

/**
 * @program: whyrpcframework
 * @description:
 * @author: @why
 * @create: 2021-03-11 20:06
 **/
@Slf4j
public class NettyClientHandler extends SimpleChannelInboundHandler<RpcResponse> {
    @Override
    public void channelActive(ChannelHandlerContext ctx) throws Exception {
        log.info("当被通知这个通道是活动的时候执行");
        super.channelActive(ctx);
    }

    /**
     * 在这里记录接收到的消息
     * @param ctx
     * @param msg
     * @throws Exception
     */
    @Override
    protected void channelRead0(ChannelHandlerContext ctx, RpcResponse msg) throws Exception {

        try {
            //这里只需要处理收到的消息，即 RpcResponse 对象，
            // 由于前面已经有解码器解码了，这里就直接将返回的结果放入 ctx 中即可。
            log.info("客户端接收到信息{}",msg);
            /**
             * 将获取到的数据set到了通道中。
             */
            AttributeKey<RpcResponse> key = AttributeKey.valueOf("rpcResponse");
            ctx.channel().attr(key).set(msg);
            ctx.channel().close();
        }finally {
            ReferenceCountUtil.release(msg);
        }

    }

    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
        log.error("过程调用时有错误发生:");
        cause.printStackTrace();
        ctx.close();
    }

}
